package com.leyou.search.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.List;
import java.util.Map;

/**
 * @date: 2021/4/3 0003 0:24
 * @description: 商品索引库对象
 *
 *  @Document: 映射ES的文档
 *     indexName: 索引库
 *     type: 类型
 *     shards: 分片数量
 *     replicas：副本数量
 *  @Id: 文档主键映射
 *  @Field:
 *     type: 该字段的类型
 *        Text： 字符串类型。分词的类型
 *        Keyword： 字符串类型。不分词的类型
 *        Integer/Long/Float/Double: 数值类型。不分词的类型
 *        Date： 日期类型。不分词的类型
 *        Boolean： 布尔类型。不分词的类型
 *        Object: 对象类型，包含自定义对象，List，Set, Map。在ES中对象类型，里面的每个属性都是索引和分词的。
 *     index：该字段是否索引（如果该字段参与搜索，该字段就必须索引）
 *     analyzer: 指定分词器 （如果该索引字段需要被分词后搜索，该字段通常指定分词器）
 *          常用的ik分词器
 *              ik_smart: 最小分词。 我是程序员 -> 我  是  程序员
 *              ik_max_word：最细分词。  我是程序员 -> 我  是  程序员 程序 员
 *     store: 该字符串是否存储。（如果该字段在结果中需要被显示出来，该字段就要存储） 默认true
 *  注意：一个Goods对象对应一条Spu的记录
 */
@Data
@Document(indexName = "goods" ,type = "docs",shards = 1,replicas = 1)
public class Goods {

    @Id
    private Long id;//spu的ID

    @Field(type= FieldType.Text, index = true ,analyzer = "ik_max_word" )
    private String spuName;//spu的name     为了做高亮显示，该字段依然还要索引，要分词

    @Field(type= FieldType.Text,index =true ,analyzer = "ik_max_word")
    private String all;//all存储商品的所有需要被搜索的字段内容。spu的name+" "+sku的title+spu的subTitle等  要索引，要分词

    @Field(type = FieldType.Keyword,index = false)
    private String subTitle;//spu的subTiltle  不索引，不分词

    @Field(type = FieldType.Keyword,index = false)
    private String skus;//存储的List<Sku>集合json字符串  不索引，不分词

    @Field(type = FieldType.Long)
    private List<Long> price;//商品的sku所有价格    索引，不分词

    @Field(type = FieldType.Long)
    private Long categoryId;//商品的分类ID  索引，不分词

    @Field(type = FieldType.Long)
    private Long brandId;//商品的品牌ID   索引，不分词

    @Field(type = FieldType.Object )
    private Map<String,Object> specs;//存储当期商品所有用于搜索的规格参数  索引，分词

    @Field(type = FieldType.Long)
    private Long createTime;//商品到导入时间   索引，不分词
}

